<?php
declare (strict_types = 1);

namespace app\common\controller;

use think\App;
use think\exception\ValidateException;
use think\Validate;
use think\facade\View;
/**
 * 控制器基础类
 */
abstract class BaseController
{
    /**
     * Request实例
     * @var \think\Request
     */
    protected $request;

    /**
     * 应用实例
     * @var \think\App
     */
    protected $app;

    /**
     * 是否批量验证
     * @var bool
     */
    protected $batchValidate = false;

    /**
     * 控制器中间件
     * @var array
     */
    protected $middleware = [];
	
	/**
	 * 视图类实例
	 * @var \think\View
	 */
	protected $view;

    /**
     * 构造方法
     * @access public
     * @param  App  $app  应用对象
     */
    public function __construct(App $app = null)
    {
        $this->app     = $app ?: app();
        $this->request = $this->app->request;
		// if (request()->isMobile() == false && (config('app.web_site_status') == 1 || config('app.web_site_status') == 2)) {
		// 	// 非移动端 修改视图模板路径
		// 	$view_path = app_path(). app('http')->getName() . '/view/pc/';
		// 	$view_file = $view_path.request()->controller(true).'/'.request()->action(true).'.html';
		// 	// dump($view_file);
		// 	if (is_file($view_file)){
		// 		\think\facade\Config::set(['view_path' => $view_path], 'view');
		// 	}
		// }
        // 控制器初始化
        $this->initialize();
    }

    // 初始化
    protected function initialize()
    {}

    /**
     * 验证数据
     * @access protected
     * @param  array        $data     数据
     * @param  string|array $validate 验证器名或者验证规则数组
     * @param  array        $message  提示信息
     * @param  bool         $batch    是否批量验证
     * @return array|string|true
     * @throws ValidateException
     */
    protected function validated(array $data, $validate, array $message = [], bool $batch = false)
    {
        if (is_array($validate)) {
            $v = new Validate();
            $v->rule($validate);
        } else {
            if (strpos($validate, '.')) {
                // 支持场景
                [$validate, $scene] = explode('.', $validate);
            }
            $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
            $v     = new $class();
            if (!empty($scene)) {
                $v->scene($scene);
            }
        }

        $v->message($message);

        // 是否批量验证
        if ($batch || $this->batchValidate) {
            $v->batch(true);
        }

        return $v->failException(true)->check($data);
    }
	/**
	 * 验证数据
	 * @access protected
	 * @param  array        $data     数据
	 * @param  string|array $validate 验证器名或者验证规则数组
	 * @param  array        $message  提示信息
	 * @param  bool         $batch    是否批量验证
	 * @param  mixed        $callback 回调方法（闭包）
	 * @return array|string|true
	 * @throws ValidateException
	 */
	protected function validate(array $data, $validate, array $message = [], bool $batch = false, $callback = null)
	{
	    if (is_array($validate)) {
	        $v = new Validate();
	        $v->rule($validate);
	    } else {
	        if (strpos($validate, '.')) {
	            // 支持场景
	            [$validate, $scene] = explode('.', $validate);
	        }
	        $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
	        $v     = new $class();
	        if (!empty($scene)) {
	            $v->scene($scene);
	        }
	    }
	
	    // 是否批量验证
	    if ($batch || $this->batchValidate) {
	        $v->batch(true);
	    }
	
	    if (is_array($message)) {
	        $v->message($message);
	    }
	
	    if ($callback && is_callable($callback)) {
	        call_user_func_array($callback, [$v, &$data]);
	    }
	
	    if (!$v->check($data)) {
	        return $v->getError();
	    }
	    return true;
	}
	/**
	 * 加载模板输出
	 * @access protected
	 * @param  string $template 模板文件名
	 * @param  array  $vars     模板输出变量
	 * @param  array  $config   模板参数
	 * @return mixed
	 */
	protected function fetch($template = '', $vars = [], $config = [])
	{
	    return View::fetch($template, $vars, $config);
	}
	/**
	 * 模板变量赋值
	 * @access protected
	 * @param  mixed $name  要显示的模板变量
	 * @param  mixed $value 变量的值
	 * @return $this
	 */
	protected function assign($name, $value = '')
	{
	    $this->view = View::assign($name, $value);
	
	    return $this;
	}
	
	use \liliuwei\think\Jump;

}
